/**
 * PanelCicloLectivo.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Anio;
import adsec.entidades.Estado;
import adsec.entidades.LlaveValor;
import adsec.entidades.Materia;
import adsec.entidades.MateriaCursada;
import adsec.entidades.Nivel;
import adsec.entidades.Periodo;
import adsec.entidades.Periodos;
import adsec.entidades.Permiso;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraMateriaCursada;
import adsec.negocios.ControladoraPeriodo;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelCicloLectivo extends javax.swing.JPanel implements ActionListener, ListSelectionListener {

    private LinkedList<Materia> materiasDisponibles;
    private LinkedList<Materia> materiasSeleccionadas;
    private LinkedList<MateriaCursada> materiasCursadas;
    private LinkedList<Periodos> listaPeriodos;
    private ControladoraMateriaCursada controladoraMateriaCursada;
    private ControladoraPeriodo controladoraPeriodos;
    private AdministradorSeguridad adminSeguridad;
    private Permiso permiso;
    private Estado estado;
    private final int [] cantPeriodos = {3,1,2,6,4};
    private final double [][] porcentajes = {
        {30, 30, 40},
        {100},
        {50, 50},
        {16, 16, 16, 16, 16, 20},
        {25, 25, 25, 25}
    };
    private final int columnaBorrar = 5;
    private int idMateria;
    private int idMateriaCursada;
    private String errorAño = "Debe ser un año válido:\n1.El campo solo permite formato númerico\n2. Verifique la cantidad de digitos, debe de ser 4 digitos";

    /** Creates new form PanelCicloLectivo */
    public PanelCicloLectivo() {
        initComponents();
        this.iniciarPanelCicloLectivo();
    }

    public void iniciarPanelCicloLectivo(){
        this.adminSeguridad = AdministradorSeguridad.getInstancia();
        this.controladoraMateriaCursada = new ControladoraMateriaCursada();
        this.controladoraPeriodos = new ControladoraPeriodo();
        this.permiso = adminSeguridad.getPermiso(UtilidadesCapaNegocios.moduloConfiguracionCicloLectivo);
        this.estado = new Estado();
        this.materiasDisponibles = new LinkedList<Materia>();
        this.materiasSeleccionadas = new LinkedList<Materia>();
        this.materiasCursadas = new LinkedList<MateriaCursada>();
        this.listaPeriodos = new LinkedList<Periodos>();
        this.idMateria = this.idMateriaCursada = 1;
        this.habilitarAceptarCancelar(false);
        this.habilitarBotonesIME(this.permiso.isInsertar(), false, false);
        this.setHabilitarCampos(false);
        this.cargarGridMateriasCursadas();
    }//fin de iniciarPanelCicloLectivo

    /**
     ** Recibe un boolean para habilitar todos los campos de la pantalla
     ** o ya sea deshabilitarlos
     **/
    private void setHabilitarCampos(boolean habilitar){
        this.cbAño.setEnabled(habilitar);
        this.cbNivel.setEnabled(habilitar);
        this.listaDisponibles.setEnabled(habilitar);
        this.listaSeleccionadas.setEnabled(habilitar);
        this.spinNotaMinima.setEnabled(habilitar);
        this.gridPeriodos.setEnabled(habilitar);
        this.gridMateriasTemporal.setEnabled(habilitar);
        this.cbModalidad.setEnabled(habilitar);
        this.txtCantPeriodos.setEnabled(habilitar);
        this.btnAgregarUna.setEnabled(habilitar);
        this.btnAgregarTodas.setEnabled(habilitar);
        this.btnRemoverUna.setEnabled(habilitar);
        this.btnRemoverTodas.setEnabled(habilitar);
        this.habilitarAgregarBorrar(habilitar);
        if(habilitar && this.estado.getEstadoActual() == Estado.MODIFICAR){
            this.cbNivel.setEnabled(!habilitar);
            this.listaDisponibles.setEnabled(!habilitar);
            this.btnAgregarUna.setEnabled(!habilitar);
            this.btnAgregarTodas.setEnabled(!habilitar);
            this.btnRemoverUna.setEnabled(!habilitar);
            this.btnRemoverTodas.setEnabled(!habilitar);
        }
    }//fin de setHabilitarCampos

    /**
     ** Habilita o deshabilita los botones insertar, modificar y eliminar
     **/
    private void habilitarBotonesIME(boolean insertar, boolean modificar, boolean eliminar){
        this.btnInsertar.setEnabled(insertar);
        this.btnModificar.setEnabled(modificar);
        this.btnEliminar.setEnabled(eliminar);
    }

    /**
     ** Habilita o deshabilita los botones aceptar y cancelar
     **/
    private void habilitarAceptarCancelar(boolean habilitar){
        this.btnAceptar.setEnabled(habilitar);
        this.btnCancelar.setEnabled(habilitar);
    }

    private void habilitarAceptar(){
        int filas = ((DefaultTableModel)this.gridMateriasTemporal.getModel()).getRowCount();
        this.btnAceptar.setEnabled(filas > 0);
    }

    /**
     ** Habilita o deshabilita los botones agregar y borrar seleccionados
     **/
    private void habilitarAgregarBorrar(boolean habilitar){
        this.btnAgregar.setEnabled(habilitar);
        this.btnBorrar.setEnabled(habilitar);
    }

    /**
     ** Limpia todos los campos de la pantalla
     **/
    private void limpiarCampos(){
        this.limpiarComboBoxes();
        this.limpiarListas();
        this.limpiarGridsTemporales();
        this.cbModalidad.setSelectedIndex(-1);
        this.txtCantPeriodos.setText("");
    }//fin de limpiarCampos

    private void limpiarComboBoxes(){
        ((DefaultComboBoxModel) this.cbNivel.getModel()).removeAllElements();
        ((DefaultComboBoxModel) this.cbAño.getModel()).removeAllElements();
    }//fin de limpiarComboBoxes

    private void limpiarListas(){
        ((DefaultListModel)this.listaDisponibles.getModel()).removeAllElements();
        ((DefaultListModel)this.listaSeleccionadas.getModel()).removeAllElements();
        this.materiasDisponibles.clear();
        this.materiasSeleccionadas.clear();
        this.materiasCursadas.clear();
        this.listaPeriodos.clear();
    }//fin de limpiarListas

    private void limpiarGridsTemporales(){
        ((DefaultTableModel)this.gridPeriodos.getModel()).setRowCount(0);
        ((DefaultTableModel)this.gridMateriasTemporal.getModel()).setRowCount(0);
    }//fin de limpiarListas

    private void limpiarCamposDespuesAgregar(){
        this.cbNivel.setSelectedIndex(-1);
        this.materiasSeleccionadas.clear();
        this.materiasDisponibles.clear();
        ((DefaultListModel)this.listaDisponibles.getModel()).removeAllElements();
        ((DefaultListModel)this.listaSeleccionadas.getModel()).removeAllElements();
    }//fin de limpiarCamposDespuesAgregar

    private void cargarAños(){
        ((DefaultComboBoxModel) this.cbAño.getModel()).removeAllElements();
        LinkedList<Anio> listaAños = this.controladoraMateriaCursada.consultarAnios();
        Iterator<Anio> iterador = listaAños.iterator();
        while(iterador.hasNext()){
            Anio año = iterador.next();
            ((DefaultComboBoxModel) this.cbAño.getModel()).addElement(año.getAnio());
        }
        this.cbAño.setSelectedIndex(-1);
    }//fin de cargarNiveles

    private void cargarNiveles(){
        this.cbNivel.removeActionListener(this);
        ((DefaultComboBoxModel) this.cbNivel.getModel()).removeAllElements();
        LinkedList<Nivel> listaNiveles = this.controladoraMateriaCursada.consultarNiveles();
        Iterator<Nivel> iterador = listaNiveles.iterator();
        while(iterador.hasNext()){
            Nivel nivel = iterador.next();
            ((DefaultComboBoxModel) this.cbNivel.getModel()).addElement(nivel.getNivel());
        }
        this.cbNivel.setSelectedIndex(-1);
        this.cbNivel.addActionListener(this);
    }//fin de cargarNiveles

    private void cargarGridMateriasCursadas(){
        ((DefaultTableModel)this.gridMateriasCursadas.getModel()).setNumRows(0);
        if(this.permiso.isConsultar()){
            LinkedList<MateriaCursada> materias = this.controladoraMateriaCursada.consultarMateriasCursadas();
            Iterator<MateriaCursada> iterador = materias.iterator();
            while(iterador.hasNext()){
                MateriaCursada materia = iterador.next();
                Object arregloDatos[] = new Object[4];
                arregloDatos[0] = materia.getAnio();
                arregloDatos[1] = materia.getNivel();
                arregloDatos[2] = materia.getNombre();
                arregloDatos[3] = materia.getCantidadPeriodos();
                ((DefaultTableModel)this.gridMateriasCursadas.getModel()).addRow(arregloDatos);
            }//fin de while
        }
    }//fin de cargarMaterias

    private void volverConsultar(){
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.habilitarBotonesIME(permiso.isInsertar(), false, false);
        this.setHabilitarCampos(false);
        this.cbAño.setEditable(true);
        this.habilitarAceptarCancelar(false);
        //this.txtCantPeriodos.setText(Integer.toString(this.cantPeriodos[this.cbModalidad.getSelectedIndex()]));
        this.cargarGridMateriasCursadas();
    }//fin de volverConsultar

    public void valueChanged(ListSelectionEvent evento){
        int filas = ((DefaultTableModel)this.gridMateriasCursadas.getModel()).getRowCount();
        //TODO no tan importante:Poner de nuevo el evento.getValueIsAdjusting si no funciona
        if(filas > 0 && estado.getEstadoActual() == Estado.CONSULTAR){
            int fila = this.gridMateriasCursadas.getSelectedRow();
            if(fila >= 0){
                MateriaCursada materiaCursada = this.controladoraMateriaCursada.consultarMateriaCursadaGrid(fila);
                this.idMateria = this.idMateriaCursada = -1;
                this.limpiarCampos();
                this.consultarMateriaCursada(materiaCursada);
                Periodos periodos = this.controladoraPeriodos.consultarPeriodos(idMateria, idMateriaCursada);
                this.consultarPeriodos(periodos);
            }//fin de if
        }//fin de if
    }//fin de método valueChanged

    public void actionPerformed(ActionEvent evento){
        JComboBox fuente = (JComboBox)evento.getSource();
        if(this.estado.getEstadoActual() == Estado.INSERTAR){
            if(fuente == this.cbAño){
                if(evento.getActionCommand().equals("comboBoxEdited")){
                    this.accionAñoEditado();
                }
            }

            if(fuente == this.cbNivel){
                Object nivelSelected = this.cbNivel.getSelectedItem();
                if(nivelSelected != null){
                    this.cargarMateriasDisponibles(Integer.parseInt(nivelSelected.toString()));
                }
            }

            if(fuente == this.cbModalidad){
                int indice = this.cbModalidad.getSelectedIndex();
                if(indice >= 0){
                    this.txtCantPeriodos.setText(Integer.toString(this.cantPeriodos[indice]));
                    this.crearFilasGridPeriodos(this.cantPeriodos[indice]);
                }
            }
        }//fin de if
    }//fin de actionPerformed

    public void accionAñoEditado(){
        Object añoSelected = this.cbAño.getSelectedItem();
        if(añoSelected != null){
            String seleccion = añoSelected.toString();
            if(!isNumber(seleccion) || seleccion.length() != 4 ){
                this.cbAño.setSelectedItem("");
                this.cbAño.setSelectedIndex(-1);
                JOptionPane.showMessageDialog(null, errorAño, "ERROR", JOptionPane.ERROR_MESSAGE);
            }//fin if
        }
    }//fin accionAñoEditado

    public boolean isNumber(String numero){
        boolean resultado = true;
        int numeroEntero = 0;
        try{
            numeroEntero = Integer.parseInt(numero);
        }catch(NumberFormatException excepcion){
            resultado = false;
        }
        return resultado;
    }

    private void cargarMateriasDisponibles(int nivel){
        this.materiasDisponibles = this.controladoraMateriaCursada.consultarMateriasNivel(nivel);
        ((DefaultListModel)this.listaDisponibles.getModel()).removeAllElements();
        Iterator<Materia> iterador = this.materiasDisponibles.iterator();
        while(iterador.hasNext()){
            Materia materia = iterador.next();
            ((DefaultListModel)this.listaDisponibles.getModel()).addElement(new String(materia.getNombre() + " " + materia.getNivel()));
        }
    }//fin de cargarMateriasDisponibles

    private void crearFilasGridPeriodos(int filas){
        if(filas > 0){
            ((DefaultTableModel) this.gridPeriodos.getModel()).setRowCount(0);
            for(int indice = 0; indice < filas; indice++){
                Object [] datos = new Object[2];
                datos[0] = (Object) (indice + 1);
                datos[1] = (Object) this.porcentajes[this.cbModalidad.getSelectedIndex()][indice];
                ((DefaultTableModel) this.gridPeriodos.getModel()).addRow(datos);
            }//fin de for
        }//fin de if
    }//fin de crearFilasGridPorcentajes

    private MateriaCursada obtenerDatosMateriaCursada(Materia materia){
        MateriaCursada materiaCursada = new MateriaCursada();
        materiaCursada.setIdMateria(materia.getIdMateria());
        if(this.estado.getEstadoActual() == Estado.MODIFICAR){
            materiaCursada.setIdMateriaCursada(this.idMateriaCursada);
        }
        materiaCursada.setNombre(materia.getNombre());
        materiaCursada.setNivel(materia.getNivel());
        //OJO: ya se debe haber verificado que el año esté bien
        materiaCursada.setAnio(Integer.parseInt(this.cbAño.getSelectedItem().toString()));
        materiaCursada.setNotaMinima(Integer.parseInt(this.spinNotaMinima.getValue().toString()));
        materiaCursada.setModalidad(this.cbModalidad.getSelectedItem().toString());
        materiaCursada.setCantidadPeriodos(Integer.parseInt(this.txtCantPeriodos.getText()));
        return materiaCursada;
    }

    private void agregarMateriaCursadaAGridTemporal(MateriaCursada materiaCursada){
        Object [] datos = new Object[6];
        datos[0] = (Object) materiaCursada.getAnio();
        datos[1] = (Object) materiaCursada.getNivel();
        datos[2] = (Object) materiaCursada.getNombre();
        datos[3] = (Object) materiaCursada.getCantidadPeriodos();
        datos[4] = (Object) materiaCursada.getNotaMinima();
        datos[5] = (Object) false;
        ((DefaultTableModel) this.gridMateriasTemporal.getModel()).addRow(datos);
    }//fin de agregarMateriaCursadaAGridTemporal

    private Periodos obtenerPeriodos(MateriaCursada materiaCursada){
        Periodos periodos = new Periodos();
        DefaultTableModel modelo = (DefaultTableModel) this.gridPeriodos.getModel();
        int filas = modelo.getRowCount();
        for(int indice = 0; indice < filas; indice++){
            double porcentaje = Double.parseDouble(modelo.getValueAt(indice, 1).toString());
            periodos.agregarPeriodo(new Periodo(
                materiaCursada.getIdMateria(), materiaCursada.getIdMateriaCursada(),
                indice + 1, porcentaje));
        }//fin de for
        return periodos;
    }//fin de obtenerPeriodos

    private boolean validarDatos(){
        boolean resultado = true;
        resultado &= this.cbAño.getSelectedItem() != null;
        resultado &= this.cbModalidad.getSelectedIndex() >= 0;

        if(!resultado){
            JOptionPane.showMessageDialog(null, "Debe elegir un año y una modalidad", "ERROR",JOptionPane.WARNING_MESSAGE);
        }
        return resultado;
    }//fin de validarDatos

    private boolean verificarPorcentajes(){
        boolean resultado = true;
        if(this.cbModalidad.getSelectedIndex() >= 0){
            resultado = ControladoraPeriodo.validarPeriodos(this.obtenerPeriodos(new MateriaCursada()));
        }
        if(!resultado){
            JOptionPane.showMessageDialog(null, "Las notas de los períodos deben sumar exactamente 100", "ERROR",JOptionPane.WARNING_MESSAGE);
        }
        return resultado;
    }//fin de verificarDatosObligatorios

    private void consultarMateriaCursada(MateriaCursada materiaCursada){
        if(materiaCursada != null){
            ((DefaultListModel)this.listaSeleccionadas.getModel()).addElement(new String(materiaCursada.getNombre() + " " + materiaCursada.getNivel()));
            this.idMateria = materiaCursada.getIdMateria();
            this.idMateriaCursada = materiaCursada.getIdMateriaCursada();
            this.cargarAños();
            this.cargarNiveles();
            this.materiasSeleccionadas.add(new Materia(materiaCursada));
            this.cbAño.setSelectedItem(materiaCursada.getAnio());
            this.cbNivel.setSelectedItem(materiaCursada.getNivel());
            this.cbModalidad.setSelectedItem(materiaCursada.getModalidad());
            this.txtCantPeriodos.setText(Integer.toString(materiaCursada.getCantidadPeriodos()));
            this.spinNotaMinima.setValue(materiaCursada.getNotaMinima());
            this.habilitarBotonesIME(permiso.isInsertar(), permiso.isModificar(), permiso.isEliminar());
        }else{
            String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloConfiguracionCicloLectivo, UtilidadesCapaNegocios.opConsultar);
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }//fin de else
        
    }//fin de consultarMateriaCursada

    private void consultarPeriodos(Periodos periodos){
        Iterator<Periodo> iterador = periodos.getIterador();
        while(iterador.hasNext()){
            Periodo periodo = iterador.next();
            Object [] datos = new Object[2];
            datos[0] = (Object) periodo.getNumPeriodo();
            datos[1] = (Object) periodo.getPorcentaje();
            ((DefaultTableModel) this.gridPeriodos.getModel()).addRow(datos);
        }//fin de while
    }//fin de consultarPeriodos
    
    private void insertarMateriaCursada(){
        if(this.materiasCursadas.size() > 0){
            Iterator<MateriaCursada> iteradorMateria = this.materiasCursadas.iterator();
            Iterator<Periodos> iteradorPeriodos = this.listaPeriodos.iterator();
            int cantidadErrores = 0;
            while(iteradorMateria.hasNext() && iteradorPeriodos.hasNext()){
                int resultado = this.controladoraMateriaCursada.insertarMateriaCursada(iteradorMateria.next(), iteradorPeriodos.next());
                if(resultado == UtilidadesCapaNegocios.QUERY_ERROR){
                    cantidadErrores++;
                }
            }//fin de while
            if(cantidadErrores == 0){
                this.gridMateriasCursadas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "La información del ciclo lectivo de la(s) materia(s) fue insertada exitosamente");
                this.volverConsultar();
            }else{
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloConfiguracionCicloLectivo, UtilidadesCapaNegocios.opInsertar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
            }//fin de else
        }//fin de if
    }//fin de insertarMateriaCursada

    private void modificarMateriaCursada(){
        if(this.materiasCursadas.size() > 0){
            Iterator<MateriaCursada> iteradorMateria = this.materiasCursadas.iterator();
            Iterator<Periodos> iteradorPeriodos = this.listaPeriodos.iterator();
            int cantidadErrores = 0;
            while(iteradorMateria.hasNext() && iteradorPeriodos.hasNext()){
                int resultadoMateriaCursada = this.controladoraMateriaCursada.modificarMateriaCursada(iteradorMateria.next());
                int resultadoPeriodos = this.controladoraPeriodos.modificarPeriodos(iteradorPeriodos.next());
                if(resultadoMateriaCursada == UtilidadesCapaNegocios.QUERY_ERROR ||
                        resultadoPeriodos == UtilidadesCapaNegocios.QUERY_ERROR){
                    cantidadErrores++;
                }
            }//fin de while
            if(cantidadErrores == 0){
                this.gridMateriasCursadas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "La información del ciclo lectivo de la(s) materia(s) fue modificada exitosamente");
                this.volverConsultar();
            }else{
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloConfiguracionCicloLectivo, UtilidadesCapaNegocios.opModificar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
            }//fin de else
        }//fin de if
    }//fin de modificarMateriaCursada

    private void eliminarMateriaCursada(){
        if(!this.controladoraMateriaCursada.existeEstudianteLlevaMateriaCursada(idMateria, idMateriaCursada)){
            int resultado = this.controladoraPeriodos.eliminarPeriodos(idMateria, idMateriaCursada);
            if(resultado == UtilidadesCapaNegocios.QUERY_OK){
                resultado = this.controladoraMateriaCursada.eliminarMateriaCursada(idMateria, idMateriaCursada);
            }

            if(resultado == UtilidadesCapaNegocios.QUERY_OK){
                this.gridMateriasCursadas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "La información del ciclo lectivo de la materia fue eliminada exitosamente");
                this.volverConsultar();
                this.limpiarCampos();
            }else{
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloConfiguracionCicloLectivo, UtilidadesCapaNegocios.opEliminar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
            }
        }else{
            JOptionPane.showMessageDialog(null,
                    "Existen estudiantes matriculados en la materia con esta información de ciclo lectivo",
                    "ERROR", JOptionPane.ERROR_MESSAGE);
        }//fin de else
    }//fin de eliminarMateriaCursada

    @Action
    public void insertandoMateria() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.limpiarCampos();
        this.setHabilitarCampos(true);
        this.cbAño.setEditable(true);
        this.habilitarBotonesIME(false, false, false);
        this.btnCancelar.setEnabled(true);
        this.cargarAños();
        this.cargarNiveles();
        this.spinNotaMinima.setValue(70);
    }//fin de insertandoMateria

    @Action
    public void modificandoMateria() {
        this.estado.setEstadoActual(Estado.MODIFICAR);
        this.setHabilitarCampos(true);
        this.cbAño.setEditable(false);
        this.habilitarBotonesIME(false, false, false);
        this.btnCancelar.setEnabled(true);
    }//fin de modificandoMateria

    @Action
    public void eliminandoMateria() {
        Animador.animar();
        if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
            this.eliminarMateriaCursada();
            this.limpiarCampos();
        }
        Animador.detenerAnimacion();
    }//fin de eliminandoMateria

    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion,String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloConfiguracionCicloLectivo, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    @Action
    public void accionAceptar() {
        Animador.animar();
        switch(estado.getEstadoActual()){
            case Estado.INSERTAR:
                if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR")){
                    if(verificarPorcentajes() && validarDatos()){
                        this.insertarMateriaCursada();
                    }
                }
            break;
            case Estado.MODIFICAR:
                if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opModificar, "MODIFICAR")){
                    if(verificarPorcentajes() && validarDatos()){
                        this.modificarMateriaCursada();
                    }
                }
            break;
        }//fin de switch
        Animador.detenerAnimacion();
    }//fin de accionAceptar

    @Action
    public void accionCancelar() {
        this.limpiarCampos();
        this.volverConsultar();
    }//fin de accionCancelar

    @Action
    public void accionAgregarSeleccionadas() {
        if(this.materiasSeleccionadas.size() > 0 && validarDatos() && verificarPorcentajes()){
            Iterator<Materia> iterador = this.materiasSeleccionadas.iterator();
            int buenos = 0;
            while(iterador.hasNext()){
                MateriaCursada materiaCursada = this.obtenerDatosMateriaCursada(iterador.next());
                LinkedList<LlaveValor> listaLlaves = new LinkedList<LlaveValor>();
                listaLlaves.add(new LlaveValor(MateriaCursada.anioNC, materiaCursada.getAnio()));
                listaLlaves.add(new LlaveValor(MateriaCursada.idMateriaNC, materiaCursada.getIdMateria()));
                if(this.estado.getEstadoActual() == Estado.MODIFICAR ||
                        !UtilidadesCapaNegocios.existenLlaves(MateriaCursada.nombreTabla, listaLlaves)){
                    this.agregarMateriaCursadaAGridTemporal(materiaCursada);
                    this.listaPeriodos.add(obtenerPeriodos(materiaCursada));
                    this.materiasCursadas.add(materiaCursada);
                    buenos++;
                }else{
                    JOptionPane.showMessageDialog(null, "La materia con el nombre " + materiaCursada.getNombre() +
                            " del nivel " + materiaCursada.getNivel() + " ya tiene información de ciclo lectivo en el año " + materiaCursada.getAnio(), "ERROR", JOptionPane.ERROR_MESSAGE);
                }//fin de else
            }//fin de while
            if(buenos > 0){
                this.habilitarAceptar();
                this.limpiarCamposDespuesAgregar();
            }//fin de if
        }//fin de if
    }//fin de accionAgregarSeleccionadas

    @Action
    public void accionBorrarSeleccionadas() {
        DefaultTableModel modelo = (DefaultTableModel)this.gridMateriasTemporal.getModel();
        for(int fila = modelo.getRowCount()-1; fila >= 0; fila--){
            Boolean borrar = (Boolean) modelo.getValueAt(fila, this.columnaBorrar);
            if(borrar.booleanValue()){
                modelo.removeRow(fila);
                this.materiasCursadas.remove(fila);
                this.listaPeriodos.remove(fila);
            }
        }//fin de for
        this.habilitarAceptar();
    }//fin de accionBorrarSeleccionadas

    @Action
    public void agregarUno(){
        if(!this.listaDisponibles.isSelectionEmpty()){
            int[] indices = this.listaDisponibles.getSelectedIndices();
            if(indices.length > 0){
                for(int i = indices.length - 1; i>= 0; i--){
                    Materia materia = materiasDisponibles.get(indices[i]);
                    String materiaNivel = materia.getNombre() + " " + materia.getNivel();
                    materiasSeleccionadas.add(materia);
                    ((DefaultListModel)listaSeleccionadas.getModel()).addElement(materiaNivel);
                    materiasDisponibles.remove(indices[i]);
                    ((DefaultListModel)listaDisponibles.getModel()).remove(indices[i]);
                }
            }
        }
    }//fin de agregarUno

    @Action
    public void removerUno(){
        if(!this.listaSeleccionadas.isSelectionEmpty()){
            int[] indices = this.listaSeleccionadas.getSelectedIndices();
            if(indices.length > 0){
                for(int i = indices.length - 1; i>= 0; i--){
                    Materia materia = materiasSeleccionadas.get(indices[i]);
                    String materiaNivel = materia.getNombre() + " " + materia.getNivel();
                    materiasDisponibles.add(materia);
                    ((DefaultListModel)listaDisponibles.getModel()).addElement(materiaNivel);
                    materiasSeleccionadas.remove(indices[i]);
                    ((DefaultListModel)listaSeleccionadas.getModel()).remove(indices[i]);
                }
            }
        }
    }//fin de removerUno

    @Action
    public void agregarTodos(){
        Iterator<Materia> iterador = this.materiasDisponibles.iterator();
        while(iterador.hasNext()){
            Materia materia = iterador.next();
            String materiaNivel = materia.getNombre() + " " + materia.getNivel();
            this.materiasSeleccionadas.add(materia);
            ((DefaultListModel)listaSeleccionadas.getModel()).addElement(materiaNivel);
            ((DefaultListModel)listaDisponibles.getModel()).removeElement(materiaNivel);
            iterador.remove();
        }
    }//fin de agregarTodos

    @Action
    public void removerTodos(){
        Iterator<Materia> iterador = this.materiasSeleccionadas.iterator();
        while(iterador.hasNext()){
            Materia materia = iterador.next();
            String materiaNivel = materia.getNombre() + " " + materia.getNivel();
            this.materiasDisponibles.add(materia);
            ((DefaultListModel)listaDisponibles.getModel()).addElement(materiaNivel);
            ((DefaultListModel)listaSeleccionadas.getModel()).removeElement(materiaNivel);
            iterador.remove();
        }
    }//fin de removerTodos
    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnInsertar = new javax.swing.JButton();
        btnModificar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        btnAceptar = new javax.swing.JButton();
        scrollGridMaterias = new javax.swing.JScrollPane();
        gridMateriasCursadas = new javax.swing.JTable();
        panelInformacion = new javax.swing.JPanel();
        lbCantPeriodos = new javax.swing.JLabel();
        lbNotaMinima = new javax.swing.JLabel();
        scrollListaSeleccionadas = new javax.swing.JScrollPane();
        listaSeleccionadas = new javax.swing.JList(new DefaultListModel());
        scrollPeriodos = new javax.swing.JScrollPane();
        gridPeriodos = new javax.swing.JTable();
        scrollGridMateriasTemp = new javax.swing.JScrollPane();
        gridMateriasTemporal = new javax.swing.JTable();
        btnAgregar = new javax.swing.JButton();
        btnAgregarUna = new javax.swing.JButton();
        btnRemoverTodas = new javax.swing.JButton();
        cbAño = new javax.swing.JComboBox();
        btnAgregarTodas = new javax.swing.JButton();
        lbAño = new javax.swing.JLabel();
        cbModalidad = new javax.swing.JComboBox();
        cbNivel = new javax.swing.JComboBox();
        scrollDisponibles = new javax.swing.JScrollPane();
        listaDisponibles = new javax.swing.JList(new DefaultListModel());
        spinNotaMinima = new javax.swing.JSpinner(new SpinnerNumberModel(70, 0, 100, 1));
        lbNivel = new javax.swing.JLabel();
        btnBorrar = new javax.swing.JButton();
        lbModalidad = new javax.swing.JLabel();
        btnRemoverUna = new javax.swing.JButton();
        txtCantPeriodos = new javax.swing.JTextField();

        setName("Form"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelCicloLectivo.class, this);
        btnInsertar.setAction(actionMap.get("insertandoMateria")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelCicloLectivo.class);
        btnInsertar.setText(resourceMap.getString("btnInsertar.text")); // NOI18N
        btnInsertar.setName("btnInsertar"); // NOI18N

        btnModificar.setAction(actionMap.get("modificandoMateria")); // NOI18N
        btnModificar.setText(resourceMap.getString("btnModificar.text")); // NOI18N
        btnModificar.setName("btnModificar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminandoMateria")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        scrollGridMaterias.setName("scrollGridMaterias"); // NOI18N

        gridMateriasCursadas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Año", "Nivel", "Materia", "Períodos"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        gridMateriasCursadas.setName("gridMateriasCursadas"); // NOI18N
        scrollGridMaterias.setViewportView(gridMateriasCursadas);
        gridMateriasCursadas.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridMateriasCursadas.getSelectionModel().addListSelectionListener(this);

        panelInformacion.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelInformacion.border.title"))); // NOI18N
        panelInformacion.setName("panelInformacion"); // NOI18N

        lbCantPeriodos.setText(resourceMap.getString("lbCantPeriodos.text")); // NOI18N
        lbCantPeriodos.setName("lbCantPeriodos"); // NOI18N

        lbNotaMinima.setText(resourceMap.getString("lbNotaMinima.text")); // NOI18N
        lbNotaMinima.setName("lbNotaMinima"); // NOI18N

        scrollListaSeleccionadas.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("scrollListaSeleccionadas.border.title"))); // NOI18N
        scrollListaSeleccionadas.setName("scrollListaSeleccionadas"); // NOI18N

        listaSeleccionadas.setName("listaSeleccionadas"); // NOI18N
        scrollListaSeleccionadas.setViewportView(listaSeleccionadas);

        scrollPeriodos.setName("scrollPeriodos"); // NOI18N

        gridPeriodos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Período", "Porcentaje de Evaluación"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.Double.class
            };
            boolean[] canEdit = new boolean [] {
                false, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        gridPeriodos.setName("gridPeriodos"); // NOI18N
        scrollPeriodos.setViewportView(gridPeriodos);

        scrollGridMateriasTemp.setName("scrollGridMateriasTemp"); // NOI18N

        gridMateriasTemporal.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Año", "Nivel", "Materia", "Períodos", "Nota Mínima", "Borrar"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Boolean.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        gridMateriasTemporal.setName("gridMateriasTemporal"); // NOI18N
        scrollGridMateriasTemp.setViewportView(gridMateriasTemporal);

        btnAgregar.setAction(actionMap.get("accionAgregarSeleccionadas")); // NOI18N
        btnAgregar.setText(resourceMap.getString("btnAgregar.text")); // NOI18N
        btnAgregar.setName("btnAgregar"); // NOI18N

        btnAgregarUna.setAction(actionMap.get("agregarUno")); // NOI18N
        btnAgregarUna.setText(resourceMap.getString("btnAgregarUna.text")); // NOI18N
        btnAgregarUna.setName("btnAgregarUna"); // NOI18N

        btnRemoverTodas.setAction(actionMap.get("removerTodos")); // NOI18N
        btnRemoverTodas.setText(resourceMap.getString("btnRemoverTodas.text")); // NOI18N
        btnRemoverTodas.setName("btnRemoverTodas"); // NOI18N

        cbAño.setEditable(true);
        cbAño.setName("cbAño"); // NOI18N

        btnAgregarTodas.setAction(actionMap.get("agregarTodos")); // NOI18N
        btnAgregarTodas.setText(resourceMap.getString("btnAgregarTodas.text")); // NOI18N
        btnAgregarTodas.setName("btnAgregarTodas"); // NOI18N

        lbAño.setText(resourceMap.getString("lbAño.text")); // NOI18N
        lbAño.setName("lbAño"); // NOI18N

        cbModalidad.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Trimestral", "Anual", "Semestral", "Bimestral", "Cuatrimestral" }));
        cbModalidad.setName("cbModalidad"); // NOI18N

        cbNivel.setName("cbNivel"); // NOI18N

        scrollDisponibles.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("scrollDisponibles.border.title"))); // NOI18N
        scrollDisponibles.setName("scrollDisponibles"); // NOI18N

        listaDisponibles.setName("listaDisponibles"); // NOI18N
        scrollDisponibles.setViewportView(listaDisponibles);

        spinNotaMinima.setName("spinNotaMinima"); // NOI18N

        lbNivel.setText(resourceMap.getString("lbNivel.text")); // NOI18N
        lbNivel.setName("lbNivel"); // NOI18N

        btnBorrar.setAction(actionMap.get("accionBorrarSeleccionadas")); // NOI18N
        btnBorrar.setText(resourceMap.getString("btnBorrar.text")); // NOI18N
        btnBorrar.setName("btnBorrar"); // NOI18N

        lbModalidad.setText(resourceMap.getString("lbModalidad.text")); // NOI18N
        lbModalidad.setName("lbModalidad"); // NOI18N

        btnRemoverUna.setAction(actionMap.get("removerUno")); // NOI18N
        btnRemoverUna.setText(resourceMap.getString("btnRemoverUna.text")); // NOI18N
        btnRemoverUna.setName("btnRemoverUna"); // NOI18N

        txtCantPeriodos.setEditable(false);
        txtCantPeriodos.setName("txtCantPeriodos"); // NOI18N

        javax.swing.GroupLayout panelInformacionLayout = new javax.swing.GroupLayout(panelInformacion);
        panelInformacion.setLayout(panelInformacionLayout);
        panelInformacionLayout.setHorizontalGroup(
            panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInformacionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrollGridMateriasTemp, javax.swing.GroupLayout.DEFAULT_SIZE, 590, Short.MAX_VALUE)
                    .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(scrollPeriodos, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelInformacionLayout.createSequentialGroup()
                            .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(lbNotaMinima)
                                .addComponent(lbModalidad))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(panelInformacionLayout.createSequentialGroup()
                                    .addComponent(cbModalidad, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(lbCantPeriodos)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(txtCantPeriodos, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addComponent(spinNotaMinima, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelInformacionLayout.createSequentialGroup()
                        .addComponent(btnAgregar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnBorrar))
                    .addGroup(panelInformacionLayout.createSequentialGroup()
                        .addGap(2, 2, 2)
                        .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbNivel)
                            .addComponent(lbAño))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(60, 60, 60))
                    .addGroup(panelInformacionLayout.createSequentialGroup()
                        .addComponent(scrollDisponibles, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(btnRemoverTodas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnAgregarTodas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnRemoverUna, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnAgregarUna, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(scrollListaSeleccionadas, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        panelInformacionLayout.setVerticalGroup(
            panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInformacionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbAño, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbNivel))
                .addGap(18, 18, 18)
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrollListaSeleccionadas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(scrollDisponibles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelInformacionLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnAgregarUna)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnRemoverUna)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAgregarTodas)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnRemoverTodas)
                        .addGap(20, 20, 20)))
                .addGap(18, 18, 18)
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbNotaMinima)
                    .addComponent(spinNotaMinima, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(9, 9, 9)
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbModalidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbModalidad)
                    .addComponent(lbCantPeriodos)
                    .addComponent(txtCantPeriodos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(scrollPeriodos, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(29, 29, 29)
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnBorrar)
                    .addComponent(btnAgregar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(scrollGridMateriasTemp, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        cbAño.addActionListener(this);
        cbModalidad.addActionListener(this);
        cbNivel.addActionListener(this);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(scrollGridMaterias, javax.swing.GroupLayout.DEFAULT_SIZE, 626, Short.MAX_VALUE)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(btnAceptar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(btnCancelar)))
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(btnInsertar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnModificar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(btnEliminar))
                            .addComponent(panelInformacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(14, 14, 14))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEliminar)
                    .addComponent(btnModificar)
                    .addComponent(btnInsertar))
                .addGap(18, 18, 18)
                .addComponent(panelInformacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(scrollGridMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelar)
                    .addComponent(btnAceptar))
                .addContainerGap(14, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnAgregar;
    private javax.swing.JButton btnAgregarTodas;
    private javax.swing.JButton btnAgregarUna;
    private javax.swing.JButton btnBorrar;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnInsertar;
    private javax.swing.JButton btnModificar;
    private javax.swing.JButton btnRemoverTodas;
    private javax.swing.JButton btnRemoverUna;
    private javax.swing.JComboBox cbAño;
    private javax.swing.JComboBox cbModalidad;
    private javax.swing.JComboBox cbNivel;
    private javax.swing.JTable gridMateriasCursadas;
    private javax.swing.JTable gridMateriasTemporal;
    private javax.swing.JTable gridPeriodos;
    private javax.swing.JLabel lbAño;
    private javax.swing.JLabel lbCantPeriodos;
    private javax.swing.JLabel lbModalidad;
    private javax.swing.JLabel lbNivel;
    private javax.swing.JLabel lbNotaMinima;
    private javax.swing.JList listaDisponibles;
    private javax.swing.JList listaSeleccionadas;
    private javax.swing.JPanel panelInformacion;
    private javax.swing.JScrollPane scrollDisponibles;
    private javax.swing.JScrollPane scrollGridMaterias;
    private javax.swing.JScrollPane scrollGridMateriasTemp;
    private javax.swing.JScrollPane scrollListaSeleccionadas;
    private javax.swing.JScrollPane scrollPeriodos;
    private javax.swing.JSpinner spinNotaMinima;
    private javax.swing.JTextField txtCantPeriodos;
    // End of variables declaration//GEN-END:variables

}
